package com.lz.generics;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * 通过 {@link ParameterizedType} 获取泛型参数类型
 * 注意：
 *      不是所有的都可以获取到，只有通过匿名累的方式才能获取到
 * @<href>https://www.iteye.com/news/32333</href>
 *
 * @author Lizhong
 * @date 2019/5/13
 */
public class ErasedType {
    public static void main(String[] args) {
        // 注意区别 string实现为匿名类
        List<String> string = new ArrayList<>() {
        };
        // 普通泛型List
        List<Integer> integer = new ArrayList<>();
        System.out.println(string.getClass() + "=" + integer.getClass()); // class java.util.ArrayList=class java.util.ArrayList


        Type genericSuperclass = string.getClass().getGenericSuperclass();
        printActualClassType(genericSuperclass);
        Type genericSuperclass1 = string.getClass().getGenericSuperclass();
        printActualClassType(genericSuperclass1);


    }

    private static void printActualClassType(Type aClass) {
        ParameterizedType cast = ParameterizedType.class.cast(aClass);
        Type[] actualTypeArguments = cast.getActualTypeArguments();
        for (Type actualTypeArgument : actualTypeArguments) {
            System.out.println(actualTypeArgument.getTypeName());
        }
    }
}
